var XMPP = {
    SERVER_BOSCH    : 'http://unforgivens:5280/http-bind/',
    SERVER_NAME     : 'unforgivens',
    connection      : null,
    ROOM            : 'listadeldia@conference.unforgivens',
    nickname        : null,
    jid             : null,
    resource        : null,

    NS_MUC          : "http://jabber.org/protocol/muc",

    joined          : null,
    participants    : null,

    MAXSTANZAS      : 0, // Número de stanzas previas a recibir al ingreso de la sala

    conectar : function(){
        XMPP.connection = new Strophe.Connection(XMPP.SERVER_BOSCH);

        XMPP.connection.connect(
            XMPP.jid+'/'+XMPP.resource, '',
            function (status) {
                if (status === Strophe.Status.CONNECTED) {
                    $(document).trigger('connected');
                } else if (status === Strophe.Status.DISCONNECTED) {
                    $(document).trigger('disconnected');
                }
            });
    },

    attach: function(conn){
        Common.log('Procedemos a realizar el attach<br/>jid  '+conn.jid+'<br/>sid  '+conn.sid+'<br/>rid  '+conn.rid+'');
        XMPP.connection = new Strophe.Connection(XMPP.SERVER_BOSCH);

        XMPP.connection.attach(conn.jid, conn.sid, parseInt(conn.rid)+1, function(status){
             if (status === Strophe.Status.ATTACHED) {
                 $(document).trigger('attached');
             }else Common.log('el valor devuelto por attach '+status);
        });
    },

    // Manejador para las stanzas presence
    on_presence: function (presence) {
        var from = $(presence).attr('from');
        var room = Strophe.getBareJidFromJid(from);

                                //Common.log('New presence a la sala <br/>TYPE '+$(presence).attr('type')+'<br/>FROM '+from+'<br/>TO '+$(presence).attr('to')+' <br/>ROOM (barejid) '+room+'<br/>NICK '+nick);
        // Nos aseguramos que la presence sea para esta sala..
        if (room === XMPP.ROOM) {
            var nick = Strophe.getResourceFromJid(from);
        
            if ($(presence).attr('type') === 'error' && !XMPP.joined) {
                Common.log($(presence).text());
                //XMPP.connection.disconnect();
            }
            else if ($(presence).attr('type') !== 'unavailable') {
                
                //Si la presencia es de un usuario que se acaba de unir...
                if ($(presence).attr('type') !== 'error' && nick !== XMPP.nickname){
                    Common.log(nick+' esta en la sala');
                }

                //Añadimos a la lista de participantes
                if (!XMPP.participants[nick]){
                    var user_jid = $(presence).find('item').attr('jid');
                    XMPP.participants[nick] = user_jid || true;
                    $('#usuarios_list').append('<li>' + nick + '</li>');
                }
            }
            if ($(presence).attr('type') === 'unavailable'){
                // remove from participants list
                $('#usuarios_list li').each(function(){
                    if (nick === $(this).text()) {
                        $(this).remove();
                        return false;
                    }
                });
            }
            if ($(presence).attr('type') !== 'error' && !XMPP.joined) {
                //Vemos si la presencia es nuestra para conectarnos
                if(nick === XMPP.nickname){
                    // Vemos si ha cambiado nuestro nick
                    if ($(presence).find("status[code='210']").length > 0) {
                        XMPP.nickname = Strophe.getResourceFromJid(from);
                    }                    
                    // Ya estamos conectados
                    $(document).trigger("room_joined");                    
                }
            }
        }        
        return true;
    },

    // Manejador para las stanzas message
    on_public_message: function (message) {
        var from = $(message).attr('from');
        var room = Strophe.getBareJidFromJid(from);

        // Nos aseguramos que el message sea para esta sala
        if (room === XMPP.ROOM) {
            
            var body = $(message).children('body').text();
            var subject = $(message).children('subject').text();

            //Si es una canción ejecutamos la búsqueda para ver si coincide con la búsqueda actual
            if (subject === 'new_song') {
                var id_cancion = body;
                XMPP.add_song(id_cancion);
            }else if(subject === 'new_comment'){
                array = body.split('--');
                id_cancion = array[0];
                id_comentario = array[1];
                usuario = array[2];
                comentario = array[3];
                Common.log('llamando a add_comment');
                XMPP.add_comment(id_cancion, id_comentario, usuario, comentario);
            }
        }

        return true;
    },

    add_song: function (id_cancion) {
        Canciones.show_new_song(id_cancion);
    },

    add_comment: function(id_cancion, id_comentario, usuario, comentario){
        Common.log('llamando para que muestren el comentario');
        Canciones.show_new_comment(id_cancion, id_comentario, usuario, comentario);
    },

    // Enviamos un message de type groupchat. En el body va el id de cancion y en el subject va el texto "new_song"
    notificar_cancion: function(id_cancion){
        if(XMPP.connection){
            Canciones.subida_por_mi = true;
            XMPP.connection.send(
                $msg(
                    {to: XMPP.ROOM, type: "groupchat"}).c("body").t(id_cancion)
                                                       .up().c("subject").t("new_song"),
                                                   function(){
                                                       Canciones.subida_por_mi = false;
                                                   });
        }
    },

    notificar_comentario: function(id_cancion, data){
        Common.log('voy a notificar el comentario nuevo');
        if(XMPP.connection){
            Canciones.subida_por_mi = true;
            XMPP.connection.send(
                $msg(
                    {to: XMPP.ROOM, type: "groupchat"}).c("body").t(id_cancion+'--'+data.id_comentario+'--'+data.usuario+'--'+data.comentario)
                                                       .up().c("subject").t("new_comment"),
                                                   function(){
                                                       Canciones.subida_por_mi = false;
                                                   });
        }
    }
}

/**
 * Connect : Conectar
 * Establece la conexión BOSCH.
 * Si se viene del formulario de login se ha de establecer una conexión nueva. Si no hemos de comprobar si existe activa una conexión en la cookie
 * Si todo va bien lanza el evento connected (conectado) o attached (atado)
 */
$(document).bind('connect', function (ev, data) {
    Common.log('conectando...');
    
    XMPP.jid = data.name+'@'+XMPP.SERVER_NAME;
    XMPP.nickname = data.name;
    XMPP.resource = data.name;

 //   if(data.from_login){
   //     Common.log('venimos del login -> conectar desde cero');
        XMPP.conectar();
    /*}else{
        if($.cookie('xmppconnection') != null){
            Common.log('La cookie existe -> recuperar la conexión: '+$.cookie('xmppconnection'));
            var conn = $.evalJSON($.cookie('xmppconnection'));
            XMPP.attach(conn);
        }
        else {XMPP.conectar();Common.log('No vengo del login ni existe cookie...');}
    } */
});

/**
 * Connected : conectado
 * Manda la presencia inicial para establecer su estado online y añade manejadores para presence y message
 * Por último lanza la presencia directa a la sala para conectarse
 */
$(document).bind('connected', function () {
    Common.log('CONECTADO');
    XMPP.joined = false;
    XMPP.participants = {};

    XMPP.connection.addHandler(XMPP.on_presence,null, "presence");
    XMPP.connection.addHandler(XMPP.on_public_message,null, "message", "groupchat");

    XMPP.connection.send($pres().c('priority').t('-1'));
    XMPP.connection.send(
                        $pres({to: XMPP.ROOM + "/" + XMPP.nickname})
                            .c("x", {xmlns: XMPP.NS_MUC})
                                .c("history", {maxstanzas: XMPP.MAXSTANZAS})
                        );

    /*var connection_serialized = $.toJSON(XMPP.connection);
    $.cookie('xmppconnection', connection_serialized);
    Common.log('Se ha guardado en cookie la conexión:<br/> jid  '+XMPP.connection.jid+'<br/>sid  '+XMPP.connection.sid+'<br/>rid  '+XMPP.connection.rid);*/
    
});

$(document).bind('attached', function(){
    Common.log('ATADO');
    XMPP.joined = false;
    XMPP.participants = {};

    XMPP.connection.addHandler(XMPP.on_presence,null, "presence");
    XMPP.connection.addHandler(XMPP.on_public_message,null, "message", "groupchat");

    XMPP.connection.send($pres().c('priority').t('-1'));
    XMPP.connection.send(
                        $pres({to: XMPP.ROOM + "/" + XMPP.nickname})
                            .c("x", {xmlns: XMPP.NS_MUC})
                                .c("history", {maxstanzas: XMPP.MAXSTANZAS})
                        );

    var connection_serialized = $.toJSON(XMPP.connection);

    $.cookie('xmppconnection', connection_serialized);
    Common.log('Se ha guardado en cookie la conexión:<br/> jid  '+XMPP.connection.jid+'<br/>sid  '+XMPP.connection.sid+'<br/>rid  '+XMPP.connection.rid);

});

$(document).bind('disconnected', function () {
    Common.log('DESCONECTADO '+$.toJSON(XMPP.connection));
    XMPP.connection = null;
    $('#participant-list').empty();
});

$(document).bind('room_joined', function () {
    Common.log('te has unido a la sala...');
    XMPP.joined = true;
});